home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / clipper / nfsrc21.zip / MENU1.PRG < prev    next >
Text File  |  1991-08-15  |  20KB  |  552 lines

  1. /*
  2.  * File......: MENU1.PRG
  3.  * Author....: Paul Ferrara
  4.  * CIS ID....: 76702,556
  5.  * Date......: $Date:   15 Aug 1991 23:04:42  $
  6.  * Revision..: $Revision:   1.2  $
  7.  * Log file..: $Logfile:   E:/nanfor/src/menu1.prv  $
  8.  *
  9.  * This is an original work by Paul Ferrara and is placed in the
  10.  * public domain.
  11.  *
  12.  * Modification history:
  13.  * ---------------------
  14.  *
  15.  * $Log:   E:/nanfor/src/menu1.prv  $
  16.  * 
  17.  *    Rev 1.2   15 Aug 1991 23:04:42   GLENN
  18.  * Forest Belt proofread/edited/cleaned up doc
  19.  * 
  20.  *    Rev 1.1   14 Jun 1991 19:52:12   GLENN
  21.  * Minor edit to file header
  22.  * 
  23.  *    Rev 1.0   01 Apr 1991 01:01:40   GLENN
  24.  * Nanforum Toolkit
  25.  *
  26.  */
  27.  
  28.  
  29. /*  $DOC$
  30.  *  $FUNCNAME$
  31.  *     FT_MENU1()
  32.  *  $CATEGORY$
  33.  *     Menus/Prompts
  34.  *  $ONELINER$
  35.  *     Pulldown menu system
  36.  *  $SYNTAX$
  37.  *     FT_MENU1( <acBarNames>, <acOptions>, <acAction>,
  38.  *               <acColors> [, <nTopRow> ], [ <lShadow> ] ) -> NIL
  39.  *  $ARGUMENTS$
  40.  *     <acBarNames> is a character array containing the names to appear
  41.  *     on the menu bar.
  42.  *
  43.  *     <acOptions> is a multi-dimensional array with one element for each
  44.  *     selection to appear on the pulldown menus.
  45.  *
  46.  *     <acColors> is an array containing the colors for the menu groups.
  47.  *
  48.  *     <nTopRow> is a numeric value that determines the row for the menu
  49.  *     bar.  If omitted, it defaults to 0.
  50.  *
  51.  *     <lShadow> is a logical variable.  If true (.T.) or omitted, it
  52.  *     uses FT_SHADOW() to add a transparent shadow to the each
  53.  *     pulldown menu.  If false (.F.), the menu is drawn without
  54.  *     the shadow.
  55.  *
  56.  *     All arguments except nTopRow and lShadow are required.
  57.  *  $RETURNS$
  58.  *     NIL
  59.  *  $DESCRIPTION$
  60.  *     FT_MENU1() is a function that displays a pulldown menu for each item
  61.  *     on the menu bar and executes the corresponding function for the item
  62.  *     selected.  When a called function returns false, FT_MENU1 returns
  63.  *     control to the calling program.
  64.  *
  65.  *     Valid keystrokes and their corresponding actions:
  66.  *
  67.  *     Home             -  Activates Pulldown for first item on the menu bar
  68.  *     End              -  Activates Pulldown for last item on the menu bar
  69.  *     Left Arrow       -  Activates next Pulldown to the left
  70.  *     Right Arrow      -  Activates next Pulldown to the right
  71.  *     Tab              -  Same as Right Arrow
  72.  *     Shift-Tab        -  Same as Left Arrow
  73.  *     Page Up          -  Top item on current Pulldown menu
  74.  *     Page Down        -  Bottom item on current Pulldown menu
  75.  *     Enter            -  Selects current item
  76.  *     Alpha Character  -  Moves to closest match and selects
  77.  *     Alt-<Key>        -  Moves to corresponding menu bar item
  78.  *     Escape           -  Prompts for confirmation and either returns to
  79.  *                         the calling routine or resumes
  80.  *  $EXAMPLES$
  81.  *     // Declare arrays
  82.  *     LOCAL aColors  := {}
  83.  *     LOCAL aBar     := { " ENTER/EDIT ", " REPORTS ", " DISPLAY " }
  84.  *
  85.  *     // Include the following two lines of code in your program, as is.
  86.  *     // The first creates aOptions with the same length as aBar.  The
  87.  *     // second assigns a three-element array to each element of aOptions.
  88.  *     LOCAL aOptions[ LEN( aBar ) ]
  89.  *     AEVAL( aBar, { |x,i| aOptions[i] := { {},{},{} } } )
  90.  *
  91.  *     // fill color array
  92.  *     // Box Border, Menu Options, Menu Bar, Current Selection, Unselected
  93.  *     aColors := IF( lColor, {"W+/G", "N/G", "N/G", "N/W", "N+/G"}, ;
  94.  *                            {"W+/N", "W+/N", "W/N", "N/W","W/N"} )
  95.  *
  96.  *  // array for first pulldown menu
  97.  *  FT_FILL( aOptions[1], 'A. Execute A Dummy Procedure' , {|| fubar()}, .t. )
  98.  *  FT_FILL( aOptions[1], 'B. Enter Daily Charges'       , {|| .t.},     .f. )
  99.  *  FT_FILL( aOptions[1], 'C. Enter Payments On Accounts', {|| .t.},     .t. )
  100.  *
  101.  *  // array for second pulldown menu
  102.  *  FT_FILL( aOptions[2], 'A. Print Member List'         , {|| .t.},     .t. )
  103.  *  FT_FILL( aOptions[2], 'B. Print Active Auto Charges' , {|| .t.},     .t. )
  104.  *
  105.  *  // array for third pulldown menu
  106.  *  FT_FILL( aOptions[3], 'A. Transaction Totals Display', {|| .t.},     .t. )
  107.  *  FT_FILL( aOptions[3], 'B. Display Invoice Totals'    , {|| .t.},     .t. )
  108.  *  FT_FILL( aOptions[3], 'C. Exit To DOS'               , {|| .f.},     .t. )
  109.  *
  110.  *     Call FT_FILL() once for each item on each pulldown menu, passing it
  111.  *     three parameters:
  112.  *
  113.  *        FT_FILL( <cMenuSelection>, <bCodeBlock>, <lSelectable>
  114.  *
  115.  *     <cMenuSelection> is a character string which will be displayed on
  116.  *      the pulldown menu.
  117.  *
  118.  *     <bCodeBlock> should contain one of the following:
  119.  *
  120.  *        A function name to execute, which in turn should return .T. or .F.
  121.  *        FT_MENU1 WILL RETURN CONTROL TO THE CALLING PROGRAM IF .F. IS
  122.  *        RETURNED OR CONTINUE IF .T. IS RETURNED.
  123.  *
  124.  *        .F. WHICH WILL CAUSE FT_MENU1 TO RETURN CONTROL TO THE CALLING
  125.  *        PROGRAM.
  126.  *
  127.  *        .T. WHICH WILL DO NOTHING.  THIS ALLOWS THE DEVELOPER TO DESIGN A
  128.  *        SKELETON MENU STRUCTURE PRIOR TO COMPLETING ALL OF THE SUBROUTINES.
  129.  *
  130.  *     // CALL FT_MENU1
  131.  *     FT_MENU1( aBar, aOptions, aColors, 0 )
  132.  *
  133.  *     NOTE: FT_MENU1() disables Alt-C and Alt-D in order to make them
  134.  *           available for the menu bar.  It enables Alt-D and resets
  135.  *           Alt-C to its previous state prior to calling each function.
  136.  *  $SEEALSO$
  137.  *     FT_FILL()
  138.  *  $END$
  139.  */
  140.  
  141.  
  142.  
  143.  
  144. /*
  145.      For the sample program:
  146.  
  147.      Compile with "/n /dFT_TEST" SWITCHES AND LINK.
  148.  
  149.      PASS "MONO" OR "MONO" AS A COMMAND LINE PARAMETER TO FORCE MONO MODE.
  150.  
  151.      PASS "NOSNOW" OR "NOSNOW" AS A COMMAND LINE PARAMETER ON A CGA.
  152.  
  153.      PASS "VGA" OR "VGA" AS A COMMAND LINE PARAMETER FOR 50-LINE MODE.
  154.  */
  155.  
  156.  
  157.  
  158.  
  159. #define LEFTARROW  19
  160. #define RIGHTARROW  4
  161. #define ENTER      13
  162. #define CTRLEND    23
  163. #define CTRLHOME   29
  164. #define HOME        1
  165. #define END         6
  166. #define TAB         9
  167. #define SHIFTTAB  271
  168. #define PGUP       18
  169. #define PGDN        3
  170. #define ESCAPE     27
  171. #define HITTOP      1
  172. #define HITBOTTOM   2
  173. #define KEYEXCEPT   3
  174. #define NEXTITEM    3
  175. #define RESUME      2
  176. #define MAKESELECT  1
  177. #define ABORT       0
  178. #define DISABLE     0
  179. #define ENABLE      1
  180. #define SCNONE      0
  181. #define SCNORMAL    1
  182.  
  183. STATIC ACHOICES := {}, AVALIDKEYS := {}
  184. STATIC NHPOS, NVPOS, NMAXROW, NMAXCOL
  185.  
  186. // BEGINNING OF DEMO PROGRAM
  187. #IFDEF FT_TEST
  188.    // DUMMY PROCEDURE NAME SO "CCMDLINE" WILL BE LOCAL
  189.    PROCEDURE CALLMENU( cCmdLine )
  190.    LOCAL sDosScrn, nDosRow, nDosCol, lColor
  191.  
  192.    // my approach to color variables
  193.    // see colorchg.arc on NANFORUM
  194.    STATIC cNormH, cNormN, cNormE, ;
  195.           cWindH, cWindN, cWindE, ;
  196.           cErrH, cErrN, cErrE
  197.  
  198.    // options on menu bar
  199.    LOCAL aColors  := {}
  200.    LOCAL aBar     := { " ENTER/EDIT ", " REPORTS ", " DISPLAY ", " MAINTENANCE ", " QUIT " }
  201.    LOCAL aOptions[ LEN( aBar ) ]
  202.    AEVAL( aBar, { |x,i| aOptions[i] := { {},{},{} } } )
  203.  
  204.    cCmdLine := IF( cCmdLine == NIL, "", cCmdLine )
  205.  
  206.    lColor := IF( "MONO" $ UPPER( cCmdLine ), .F., ISCOLOR() )
  207.  
  208.    * Border, Box, Bar, Current, Unselected
  209.    aColors := IF( lColor, {"W+/G", "N/G", "N/G", "N/W", "N+/G"}, ;
  210.                           {"W+/N", "W+/N", "W/N", "N/W", "W/N"} )
  211.  
  212.    FT_FILL( aOptions[1], 'A. Execute A Dummy Procedure'        , {|| fubar()}, .t. )
  213.    FT_FILL( aOptions[1], 'B. Enter Daily Charge/Credit Slips'  , {|| .t.}, .t. )
  214.    FT_FILL( aOptions[1], 'C. Enter Payments On Accounts'       , {|| .t.}, .f. )
  215.    FT_FILL( aOptions[1], 'D. Edit Daily Transactions'          , {|| .t.}, .t. )
  216.    FT_FILL( aOptions[1], 'E. Enter/Update Member File'         , {|| .t.}, .t. )
  217.    FT_FILL( aOptions[1], 'F. Update Code File'                 , {|| .t.}, .f. )
  218.    FT_FILL( aOptions[1], 'G. Add/Update Auto Charge File'      , {|| .t.}, .t. )
  219.    FT_FILL( aOptions[1], 'H. Post All Transactions To A/R File', {|| .t.}, .t. )
  220.    FT_FILL( aOptions[1], 'I. Increment Next Posting Date'      , {|| .t.}, .t. )
  221.  
  222.    FT_FILL( aOptions[2], 'A. Print Member List'                , {|| .t.}